﻿#include<iostream>
/*
拷贝构造
如果⼀个构造函数的第⼀个参数是⾃⾝类类型的引⽤，且任何额外的参数都有默认值，则此构造函数
也叫做拷⻉构造函数，也就是说拷⻉构造是⼀个特殊的构造函数。
拷贝构造具有以下特点
1、拷贝构造是构造函数的一个重载
2、拷贝构造的第一个参数必须是自身类类型的引用，不能直接传参，否则会引发逻辑上的无穷递归调用，可以有其它参数
但必须是缺省参数
3、C++规定自定义类型进行拷贝行为必须调用拷贝构造，也就是说自定义类型的传值传参和传值返回都要自动调用其拷贝构造
4、若为显示定义拷贝构造，编译器会自动生成拷贝构造函数，该拷贝构造对于其内置类型，会进行浅拷贝，自定义类型会调用它的
拷贝构造。
5、当出现内存申请等需要进行深拷贝的共作，便不能只靠默认的拷贝构造，需要手动写构造函数
6、在出现自定义类型的拷贝时，要注意是否会出现自定义类型局部销毁的情况，防止引用返回时出现野引用
*/
using namespace std;
class Stack {
public:
	Stack(int n = 4) {
		_a = (int*)malloc(sizeof(int) * n);
		if (_a == nullptr) {
			exit(1);
		}
		_capacity = n;
		_size = 0;
	}
	Stack(const Stack& s)//这里的参数必须是引用类型，如果直接传参会陷入递归死循环
	{
		_a = (int*)malloc(sizeof(int*) * s._capacity);
		if (_a == nullptr) {
			exit(1);
		}
		memcpy(_a, s._a, sizeof(int) * s._size);
		_capacity = s._capacity;
		_size = s._size;
	}//拷贝构造函数
	~Stack() {
		free(_a);
		_a = nullptr;
		_capacity = _size = 0;
	}
private:
	int* _a;
	int _capacity;
	int _size;
};
Stack test01() {
	Stack s3;
	return s3;
}
void test02(Stack s4) {

}
void test() {
	Stack s1;
	Stack s2 = s1;//Stack s2(s1);效果一样
	Stack rs3 = test01();//自定义类型做返回值时也要先调用拷贝函数
	test02(s1);//自定义类型传值也会调用其拷贝构造
}
int main() {
	test();
	return 0;
}